package com.leyou.gateway.task;

import com.leyou.auth.client.AuthClient;
import com.leyou.gateway.config.JwtProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 服务获取到token之后，我们可以将token保存到IOC容器中
 * 这里，我们可以直接将获取token定时任务所在的对象TokenHolder就作为存储token的容器
 */
@Slf4j
@Component
public class TokenHolder {

    //存储token的属性
    private String token;

    @Autowired
    private AuthClient authClient;

    @Autowired
    private JwtProperties jwtProp;

    //刷新token的时间
    private static final long TOKEN_REFRESH_INTERVAL = 86400000L;

    //获取token失败后重试的间隔时间
    private static final long TOKEN_RETRY_INTERVAL = 10000L;

    /**
     * 每24小时定时获取token，如果获取不到，等十秒再获取，之道获取到token为止。
     * @return
     */
    @Scheduled(fixedRate = TOKEN_REFRESH_INTERVAL)
    public void appLogin(){
        //每隔24小时，就不断去获取token，直到成功位置
        while (true){
            String token = null;
            try {
                //远程调用Auth服务获取token
                token = authClient.appLogin(jwtProp.getApp().getId(), jwtProp.getApp().getServiceName());
                //将获取到的token赋值给私有属性token
                this.token = token;
                log.info("【{}服务获取token成功！】", jwtProp.getApp().getServiceName());
                break;
            }catch (Exception e){
                log.error("【{}服务获取token失败，原因为：{}，十秒后重试！】", jwtProp.getApp().getServiceName(), e.getMessage());
            }
            //休息十秒
            try {
                Thread.sleep(TOKEN_RETRY_INTERVAL);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //获取token的方法
    public String getToken() {
        return token;
    }

}
